// rs = new ReadStream  read方法实在父类 父类又会会调用子类的 _read方法
let fs = require('fs')
let {Readable, Writable, Duplex, Transform} = require('stream')
let Stream = require('stream')
// 可读流
class MyReadStream extends Readable{
  _read() {
    // console.log('_____')
    // 这个是父类的方法
    // 不停的 添加数据
    this.push('123');
    this.push(null); // 没有东西就停止了
  }
}

let rs =new MyReadStream()
// 监听这个事件  就会调用父类的 read 方法  然后在调用子类的_read方法
rs.on('data', (chunk) => {
  console.log(chunk)
})

// 自定义写入流
class MyWriteStream extends Writable {
  // 子类实现 可写流方法
  _write(chunk, encoding, callback) {
    console.log(chunk)
    fs.appendFile('1.txt',chunk, ()=>{
      callback()
    })
  } 
}
let ws = new MyWriteStream()
ws.write('1')   // 只有第一次 真正的写入文件  之后放在队列  
ws.write('2')  // 第一次要调用callback  拿出缓存区的第一个内容  这个时候第二次写入

// http  res 就是基于这个的
// 双工流 
class MyDuplex extends Duplex {
  _read() {
    console.log('度')
  }
  _write() {
    console.log('写')
  }
}
let md = new MyDuplex()
md.on('data', ()=>{

})

md.write('1')


// 压缩 gzip 先把数据读出来 -》 转换 -》 写入一个新的文件  转化流
class MyTransform extends Transform{
  // 读写一起的
  _transform(chunk, encoding, callback) {
    // this.push('1223')
    // this.push(null) // 读结束
    // callback()

    this.push(chunk)
    callback()
  }

}
let myTransform = new MyTransform()
process.stdin.pipe(myTransform).pipe(process.stdout)
// myTransform.on('data', (chunk)=>{
//   console.log(chunk, 'duqude')
// })
// myTransform.write('123')


// 可写流  进程间通信 
process.stdout.write('xxx')
process.stdin.on('data', (chunk)=>{
  console.log(chunk)
})


// 如何判断一个东西是不是流
console.log(myTransform instanceof Stream)